#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Create by zhang
# Create on 2022/6/23 19:56
from domain.report.common.period_enum import PeriodEnum
from domain.report.dto.balance_sheet_dto import BalanceSheetDTO
from domain.report.repository.balance_sheet_repository import get


class BalanceSheet(BalanceSheetDTO):
    def __init__(self, dto:BalanceSheetDTO=None):
        super(BalanceSheet, self).__init__()
        if dto:
            self.__dict__ = dto.__dict__

    @classmethod
    def query(cls, stock_code:str, year:int, period:PeriodEnum, is_consolidate:bool=False):
        dto = get(stock_code, year, period, is_consolidate)
        balanceSheet = BalanceSheet()
        balanceSheet.__dict__ = dto.__dict__
        return balanceSheet

    def get_operating_assets(self):
        """
        经营性资产:一般包括货币资金、商业债券、存货、固定资产和无形资产等项目。
        商业债券 ?= 应付债券
        """
        return self.money_cap + self.bond_payable + self.inventories + self.fixed_asset + self.intangible_assets

    def get_fixed_assets_original_value(self):
        """
        固定资产原值（original value of fixed assets）即实际取得成本，需要在使用寿命期内分期摊销为费用，与其所产生的各期收益进行配比，
        这一过程就是折旧。
        固定资产净值 =  固定资产原值 - 累计折旧
        """
        # TODO 现在无法获得 固定资产原值，用 固定资产净值 代替
        return self.fixed_asset

    def current_ratio(self):
        """
        流动比率（current ratios）是流动资产与流动负债的比率。
        流动比率 = 流动资产/流动负债
        """
        return self.total_current_assets / self.total_current_liab

    def quick_ratio(self):
        """
        速动比率（quick ratio），也叫酸性测试比率（acid-test ratio）
        速动比率 = 速动资产/流动负债
        速动资产 = 流动资产 - 存货
        """
        return (self.total_current_assets - self.inventories) / self.total_current_liab

    def debt_ratio(self):
        """
        资产负债率（debt ratio）是企业负债总额与资产总额的比率，表示企业全部资金来源中有多少来自举借债务。
        资产负债率 = 负债总额/资产总额
        """
        return self.total_liab/(self.total_current_assets + self.total_noncurrent_assets)

    def equity_multiplier(self):
        """
        权益乘数（equity multiplier）是资产总额与所有者权益总额的比率，表示资产中股东权益的比率，反映企业由于举债而产生财务杠杆效应的强度。
        权益乘数 = 资产总额/所有者权益总额
        """
        return (self.total_current_assets + self.total_noncurrent_assets) / self.total_holders_equity

    def financial_debt_ratio(self):
        """
        金融性负债率（financial debt ratio），又称有息负债率
        金融性负债率 = 金融性负债总额/资产总额
        金融性负债：企业直接从银行等金融机构取得的有息负债，如短期借款、长期借款、一年内到期的非流动负债、长期应付款等，他们往往有固定的利息和确定的还款日，因此企业的偿债压力相对较大。
        """
        return (self.st_loan + self.lt_loan + self.noncurrent_liab_due_in1y + self.lt_payable) / (self.total_current_assets + self.total_noncurrent_assets)